Java Generics-এ <? extends T> একটি Upper Bounded Wildcard, যা একটি টাইপ প্যারামিটারকে T অথবা T এর সাবক্লাস দ্বারা সীমাবদ্ধ করে। এটি ব্যবহার করা হয় যখন একটি মেথড বা ডেটা স্ট্রাকচারকে নির্দিষ্ট টাইপ অথবা তার সাবক্লাসের জন্য কাজ করতে হয়।
Upper Bounded Wildcard এর গঠন
void methodName(List<? extends T> list) {
// Method body
}
এখানে:
Tহলো একটি টাইপ, যা ক্লাস বা ইন্টারফেস হতে পারে।<? extends T>নির্দেশ করে যে এই টাইপTঅথবা এর সাবক্লাস হতে হবে।
Upper Bounded Wildcard এর ব্যবহার
1. Number এবং তার সাবক্লাসে কাজ করা
import java.util.List;
import java.util.ArrayList;
public class UpperBoundedExample {
public static void printNumbers(List<? extends Number> list) {
for (Number num : list) {
System.out.println(num);
}
}
public static void main(String[] args) {
List<Integer> intList = new ArrayList<>();
intList.add(10);
intList.add(20);
List<Double> doubleList = new ArrayList<>();
doubleList.add(15.5);
doubleList.add(30.8);
printNumbers(intList); // Integer টাইপের জন্য কাজ করবে
printNumbers(doubleList); // Double টাইপের জন্য কাজ করবে
}
}
আউটপুট:
10
20
15.5
30.8
2. Generic মেথডে Upper Bounded Wildcard ব্যবহার
import java.util.List;
public class UpperBoundedGenericMethod {
public static <T extends Number> double calculateSum(List<T> list) {
double sum = 0;
for (T num : list) {
sum += num.doubleValue();
}
return sum;
}
public static void main(String[] args) {
List<Integer> intList = List.of(1, 2, 3);
List<Double> doubleList = List.of(2.5, 3.5, 4.5);
System.out.println("Sum of Integers: " + calculateSum(intList));
System.out.println("Sum of Doubles: " + calculateSum(doubleList));
}
}
আউটপুট:
Sum of Integers: 6.0
Sum of Doubles: 10.5
3. ইনহেরিটেন্স সম্পর্কিত উদাহরণ
import java.util.ArrayList;
import java.util.List;
class Animal {
public void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("Dog barks");
}
}
public class UpperBoundedInheritance {
public static void makeSound(List<? extends Animal> animals) {
for (Animal animal : animals) {
animal.sound();
}
}
public static void main(String[] args) {
List<Dog> dogList = new ArrayList<>();
dogList.add(new Dog());
makeSound(dogList); // Dog এর জন্য কাজ করবে
}
}
আউটপুট:
Dog barks
Upper Bounded Wildcard এর সুবিধা
- টাইপ সীমাবদ্ধতা:
একটি নির্দিষ্ট টাইপ এবং তার সাবক্লাসের জন্য কোডের পুনরায় ব্যবহারযোগ্যতা বৃদ্ধি করে। - কোড নমনীয়তা:
ডেটা স্ট্রাকচারের মধ্যে ইনহেরিটেন্স অনুযায়ী কাজ করতে দেয়। - টাইপ সেফটি নিশ্চিত:
টাইপ নির্দিষ্ট করার ফলে কম্পাইল-টাইমে এরর এড়ানো যায়।
Upper Bounded Wildcard এর সীমাবদ্ধতা
ডেটা সংযোজন সীমাবদ্ধ:
Upper Bounded Wildcard ব্যবহার করলে লিস্টে নতুন আইটেম যোগ করা যায় না (কেননা এটি সাবক্লাস হতে পারে বলে নিশ্চিত নয়)।List<? extends Number> list = new ArrayList<>(); list.add(10); // কম্পাইল-টাইমে এরর- টাইপ ইরেজার:
টাইপ ইরেজারের কারণে টাইপ চেকিং শুধুমাত্র কম্পাইল-টাইমে হয়, রানটাইমে নয়।
Upper Bounded Wildcard (<? extends T>) একটি শক্তিশালী ফিচার যা জাভা জেনেরিক্সে ইনহেরিটেন্স এবং টাইপ সেফটি নিশ্চিত করে। এটি কোডের পুনরায় ব্যবহারযোগ্যতা এবং নমনীয়তা বৃদ্ধি করে। তবে এটি ব্যবহারের সময় ডেটা সংযোজনের সীমাবদ্ধতা মাথায় রাখতে হবে।
Read more